/*
 * Copyright (c) 2025 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License"),
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @addtogroup TeeTrusted
 * @{
 *
 * @brief TEE（Trusted Excution Environment）可信执行环境API。
 *
 * 提供安全能力API，例如可信存储、加解密及可信时间等，用于可信应用程序开发。
 *
 * @since 20
 */

/**
 * @file tee_ext_api.h
 *
 * @brief 提供扩展接口。
 *
 * @library NA
 * @kit TEEKit
 * @include <TEEKit/tee_ext_api.h>
 * @syscap SystemCapability.Tee.TeeClient
 * @since 20
 */

#ifndef TEE_EXT_API_H
#define TEE_EXT_API_H

#include "tee_defines.h"
#include "tee_hw_ext_api.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief 定义无效用户ID的值。
 *
 * @since 20
 */
#define INVALID_USERID 0xFFFFFFFFU

/**
 * @brief 定义来自用户模式的SMC。
 *
 * @since 20
 */
#define TEE_SMC_FROM_USR 0

/**
 * @brief 定义来自内核模式的SMC。
 *
 * @since 20
 */
#define TEE_SMC_FROM_KERNEL 1

/**
 * @brief 定义保留缓冲区的大小。
 *
 * @since 20
 */
#define RESERVED_BUF_SIZE 32

/**
 * @brief 定义调用者信息。
 *
 * @since 20
 */
typedef struct ta_caller_info {
    /** 会话类型。 */
    uint32_t session_type;
    union {
        struct {
            /** 调用者的UUID。 */
            TEE_UUID caller_uuid;
            /** 调用者的组ID。 */
            uint32_t group_id;
        };
        /** 用于存储CA信息的缓冲区。 */
        uint8_t ca_info[RESERVED_BUF_SIZE];
    } caller_identity;
    /** 表示是否从内核模式发送的SMC。 */
    uint8_t smc_from_kernel_mode;
    /** 保留的缓冲区。 */
    uint8_t reserved[RESERVED_BUF_SIZE - 1];
} caller_info;

/**
 * @brief 获取当前会话的调用者信息，详细信息请参考caller_info结构体。
 *
 * @param caller_info_data 返回的调用者信息。
 * @param length 输入参数，表示caller_info_data的长度。
 *
 * @return TEE_SUCCES：操作成功。\n
 *         返回其他信息表示操作失败。
 * @since 20
 */
TEE_Result tee_ext_get_caller_info(caller_info *caller_info_data, uint32_t length);

/**
 * @brief 获取当前CA的用户ID。
 *
 * @param user_id 返回的用户ID。
 *
 * @return TEE_SUCCES：操作成功。\n
 *         返回其他信息表示操作失败。
 * @since 20
 */
TEE_Result tee_ext_get_caller_userid(uint32_t *user_id);

/**
 * @brief 添加一个能够调用此TA的调用者信息。
 * 该API适用于本地CA和HAP格式的客户端应用（CA）。
 *
 * @param cainfo_hash 调用者信息的哈希值。
 * @param length 哈希值的长度。
 *
 * @return TEE_SUCCES：操作成功。\n
 *         返回其他信息表示操作失败。
 * @since 20
 */
TEE_Result AddCaller_CA(const uint8_t *cainfo_hash, uint32_t length);

/**
 * @brief TA调用此API允许其他TA与其建立会话。
 *
 * @return TEE_SUCCES：操作成功。\n
 *         返回其他信息表示操作失败。
 * @since 20
 */
TEE_Result AddCaller_TA_all(void);

/**
 * @brief 定义来自CA的会话调用者。
 *
 * @since 20
 */
#define SESSION_FROM_CA   0

/**
 * @brief 定义来自TA的会话调用者。
 *
 * @since 20
 */
#define SESSION_FROM_TA   1

/**
 * @brief 定义找不到TA任务的情况，例如来自TA子线程的调用。
 *
 * @since 20
 */
#define SESSION_FROM_NOT_SUPPORTED   0xFE

/**
 * @brief 定义找不到TA调用者的情况。
 *
 * @since 20
 */
#define SESSION_FROM_UNKNOWN   0xFF

/**
 * @brief 获取会话类型。
 *
 * @return 返回获取的会话类型。
 *
 * @since 20
 */
uint32_t tee_get_session_type(void);

/**
 * @brief 从平台密钥派生新密钥。
 *
 * @param object [IN/OUT]输入数据通过ObjectInfo->keytype指定，输出密钥通过Attributes返回。
 * @param key_size [IN]密钥位数，也用于决定ECC曲线类型。
 * @param params [IN]未使用参数。
 * @param param_count [IN]未使用参数数量。
 * @param exinfo [IN]用户信息，用作派生的盐值。
 * @param exinfo_size [IN]用户信息的长度，最大为64字节，且必须大于0。
 *
 * @return TEE_SUCCES：操作成功。\n
 *         返回其他信息表示操作失败。
 * @since 20
 */
TEE_Result tee_ext_derive_ta_platfrom_keys(TEE_ObjectHandle object, uint32_t key_size, const TEE_Attribute *params,
    uint32_t param_count, const uint8_t *exinfo, uint32_t exinfo_size);

#ifdef __cplusplus
}
#endif

#endif
/** @} */